package pvn.com.screens;

import pvn.com.ParamsStorage;
import pvn.com.Planex1App;
import java.util.Timer;
import java.util.TimerTask;

import pvn.com.controls.TitleBar;
import pvn.com.controls.toolbar.Toolbar;
import pvn.com.interfaces.IObjectMessageListener;
import pvn.com.locale.Planex1TraderResource;
import net.rim.device.api.i18n.ResourceBundle;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.ui.decor.Background;
import net.rim.device.api.ui.decor.BackgroundFactory;

public class TitleScreen extends MainScreen implements Planex1TraderResource {
	/** Hiển thị title (FXPRO Trader)*/
	private TitleBar bar = null;
	/** Hiển thị tool bar(rate, favorites, trades, history, news*/
	public Toolbar mToolbar = null;
	
	/**Hiển thị nội dụng rate list theo danh sach tren xuống dưới*/
	private VerticalFieldManager content = null;
	
	/**Lưu chiều cao của {@bar}(bar.getPreferredHeight())*/
	protected int barHeight = 0;

	/**Lưu chiều cao của {@mToolbar}(mToolbar.getPreferredHeight())*/
	int toolbarHeight = 0;
	
	/** Background color #B9AAF9*/
	int bgColor = 12167929;
	
	/** Lấy ResourceBundle */
	protected ResourceBundle _res = ResourceBundle.getBundle(BUNDLE_ID,
			"com.fxpro.locale.FxProTrader");
	
	/** Lưu trạng thái có muốn hiển thị toolbars hay ko?*/
	boolean hasToolbar = false;

	/** Nội dung tip khi chon icon tren toolbar*/
	String tooltipText = "";
	
	/** vị trí X hiển thị tip khi chon icon tren toolbar. See: {@link #ShowTooltip(String, int, int, int)}, {@link #HideTooltip()}, {@link #paint(Graphics)}*/
	int tooltipX = 0;
	
	/** vị trí Y hiển thị tip khi chon icon tren toolbar. See: {@link #ShowTooltip(String, int, int, int)}, {@link #HideTooltip()}, {@link #paint(Graphics)}*/
	int tooltipY = 0;
	
	/** Thời gian hiển thị tip khi chon icon tren toolbar(ms). See: {@link #onDisplay()}, {@link #ShowTooltip(String, int, int, int)}, {@link #HideTooltip()}, {@link #paint(Graphics)}*/
	int tooltipDuration = 0;
	
	/** Thiết lập thời gian chạy tính toán hiển thị tip khi chon icon tren toolbar. See: {@link #onDisplay()}, {@link #onUndisplay()}*/
	private Timer tooltipTimer;

	/** chạy tính toán hiển thị tip khi chon icon tren toolbar. See: {@link #onDisplay()}, {@link #onUndisplay()}*/
	private TimerTask tooltipTask;
	
	
	/** NOTE: Không thấy dùng chỗ nào. Background active */
	private Background bgActive = BackgroundFactory.createBitmapBackground(
			Bitmap.getBitmapResource("images/edits/edit_bg_act.png"), 0, 0, 5);

	/**
	 * Xử lý hiện thị title<br>
	 * <pre>
	 * Goi  {@link #TitleScreen(String, boolean, boolean)}
	 * </pre>
	 * @param title
	 * @param hasTitle
	 */
	public TitleScreen(String title, boolean hasTitle) {
		this(title, hasTitle, hasTitle);
	}

	/**
	 * Xử lý hiện thị title<br>
	 * <pre>
	 * 1. Thiêt lập giá trị mới cho {@link #hasToolbar}
	 * 2. Khởi tạo title bar {@link #bar}
	 * 3. Khởi tạo tool bar {@link #mToolbar}
	 * 4. Nếu @hasTitle true thì 
	 * 4.1 Store PreferredHeight của {@link #bar} vào {@link #barHeight}
	 * 4.2 Add {@link #bar} vào TitleScreen
	 * </pre>
	 * @param title
	 * @param hasTitle
	 * @param _hasToolbar
	 */
	public TitleScreen(String title, boolean hasTitle, boolean _hasToolbar) {
		super(562949953421312L);
		//1. Thiêt lập giá trị mới cho {@link #hasToolbar}
		this.hasToolbar = _hasToolbar;
		//2. Khởi tạo title bar {@link #bar}
		this.bar = new TitleBar(title);
		//3. Khởi tạo tool bar {@link #mToolbar}
		this.mToolbar = new Toolbar(this._res);
		// 4. Nếu @hasTitle true 
		if (hasTitle) {
			//Lưu PreferredHeight của {@link #bar} vào {@link #barHeight}
			this.barHeight = this.bar.getPreferredHeight();
			//Add {@link #bar} vào TitleScreen
			addControl(this.bar);
		}
		//5. Nếu {@link #hasToolbar} true
		if (this.hasToolbar) {
			//5.1 Lưu PreferredHeight của {@link #mToolbar} vào {@link #toolbarHeight}
			this.toolbarHeight = this.mToolbar.getPreferredHeight();
			//5.2 Add {@link #mToolbar} vào TitleScreen
			addControl(this.mToolbar);
		}

		//6. khởi tạo content
		this.content = new VerticalFieldManager(299067162755072L) {
			/**
			 * vẽ content,
			 * @see net.rim.device.api.ui.Field#paintBackground(net.rim.device.api.ui.Graphics)
			 */
			public void paintBackground(Graphics g) {
				int height = Math.max(Display.getHeight(), getVirtualHeight());
				int width = Math.max(Display.getWidth(), getVirtualWidth());

				g.setColor(0);
				g.fillRect(0, 0, width, height);
				super.paint(g);
			}

			/* (non-Javadoc)
			 * Tạo sublayout
			 * @see net.rim.device.api.ui.container.VerticalFieldManager#sublayout(int, int)
			 */
			protected void sublayout(int maxW, int maxH) {
				int w = Display.getWidth();
				int h = Display.getHeight() - TitleScreen.this.barHeight
						- TitleScreen.this.toolbarHeight;
				super.sublayout(maxW, h);
				setExtent(w, h);
			}

			/* (non-Javadoc)
			 * TODO
			 * @see net.rim.device.api.ui.Manager#keyDown(int, int)
			 */
			protected boolean keyDown(int keycode, int status) {
				invalidate();
				return super.keyDown(keycode, status);
			}

			/* (non-Javadoc)
			 * TODO
			 * @see net.rim.device.api.ui.Manager#navigationMovement(int, int, int, int)
			 */
			protected boolean navigationMovement(int dx, int dy, int status,
					int time) {
				invalidate();

				return super.navigationMovement(dx, dy, status, time);
			}

			/* (non-Javadoc)
			 * TODO
			 * @see net.rim.device.api.ui.Manager#moveFocus(int, int, int)
			 */
			protected int moveFocus(int amount, int status, int time) {
				invalidate();
				return super.moveFocus(amount, status, time);
			}
		};
		//7. Add {@link #content} vào TitleScreen
		addControl(this.content);
	}

	/** Hiển thị tip của tool bar theo thời gian thiếp lập 
	 * @see net.rim.device.api.ui.Screen#onDisplay()
	 */
	public void onDisplay() {
		//chờ về nếu ko có tool bar
		if (!this.hasToolbar)
			return;
		//khởi tạo timer
		this.tooltipTimer = new Timer();
		//khởi tạo TimerTask
		this.tooltipTask = new TimerTask() {
			/* (non-Javadoc)
			 * Chạy tính toán hiển thị tip
			 * @see java.util.TimerTask#run()
			 */
			public void run() {
				//nếu thời gian hiển thị hết OR tip = "" thì ẩn tip 
				if ((TitleScreen.this.tooltipDuration <= 0)
						&& (TitleScreen.this.tooltipText != "")) {
					TitleScreen.this.HideTooltip();
				}

				//nếu tip != "" và thời gian chưa hết thì tính toán lại thời gian hiển thị
				if ((TitleScreen.this.tooltipText != "")
						&& (TitleScreen.this.tooltipDuration > 0)) {
					TitleScreen.this.invalidate();
					TitleScreen.this.tooltipDuration -= 500;
				}
			}
		};
		//thiết lập schedule chạy tính toán hiển thị tip
		this.tooltipTimer.scheduleAtFixedRate(this.tooltipTask, 200L, 500L);
	}

	/** Bỏ hiển thị tip
	 * @see net.rim.device.api.ui.Screen#onUndisplay()
	 */
	public void onUndisplay() {
		//chờ về nếu ko có tool bar
		if (!this.hasToolbar)
			return;
		//cancel thiết lập chạy schedule chuyển các giá trị về null
		this.tooltipTimer.cancel();
		this.tooltipTask = null;
		this.tooltipTimer = null;
	}

	/* Thiết lập Background cho TitleScreen 
	 * @see net.rim.device.api.ui.Screen#paintBackground(net.rim.device.api.ui.Graphics)
	 */
	public void paintBackground(Graphics g) {
		int height = Math.max(Display.getHeight(), getVirtualHeight());
		int width = Math.max(Display.getWidth(), getVirtualWidth());
		g.setColor(0);
		g.fillRect(0, 0, width, height);
		super.paint(g);
	}

	/**
	 * Thêm 1 field vào Screen để quản lý.
	 * @param field
	 */
	protected void addControl(Field field) {
		super.add(field);
	}

	/* (non-Javadoc)
	 * Thêm 1 field vào content Screen để quản lý.
	 * @see net.rim.device.api.ui.Screen#add(net.rim.device.api.ui.Field)
	 */
	public void add(Field field) {
		this.content.add(field);
	}

	/* (non-Javadoc)
	 * Xóa 1 field trong content Screen
	 * @see net.rim.device.api.ui.Screen#delete(net.rim.device.api.ui.Field)
	 */
	public void delete(Field field) {
		this.content.delete(field);
	}

	public boolean onSavePrompt() {
		return true;
	}

	/* (non-Javadoc)
	 * Xóa title của bar
	 * @see net.rim.device.api.ui.container.MainScreen#setTitle(java.lang.String)
	 */
	public void setTitle(String title) {
		this.bar.setTitle(title);
	}

	/* (non-Javadoc)
	 * tạo menu 
	 * @see net.rim.device.api.ui.container.MainScreen#makeMenu(net.rim.device.api.ui.component.Menu, int)
	 */
	public void makeMenu(Menu menu, int instance) {
		if (ParamsStorage.isConnected())
			menu.add(new ScreenSwitchMenuItem(SCREEN_RATES_TITLE));
		if (ParamsStorage.isConnected())
			menu.add(new ScreenSwitchMenuItem(SCREEN_FAVS_TITLE));
		if (ParamsStorage.isConnected())
			menu.add(new ScreenSwitchMenuItem(SCREEN_TRADES_TITLE));
		if (ParamsStorage.isConnected())
			menu.add(new ScreenSwitchMenuItem(SCREEN_SERVERS_INFO));
		if (ParamsStorage.isConnected())
			menu.add(new ScreenSwitchMenuItem(SCREEN_NEWS_TITLE));
		if (ParamsStorage.isConnected())
			menu.add(new ScreenSwitchMenuItem(SCREEN_DIRECT_TITLE));
		super.makeMenu(menu, instance);
	}

	/**
	 * bắt Focuse cho mToolbar
	 * @param id
	 */
	public void setFocusedButton(int id) {
		this.mToolbar.setFocusedButton(id);
	}

	/**
	 * Căn lề?
	 * @return
	 */
	protected int GetHMargin() {
		int displayWidth = Display.getWidth();
		int h_margin = Math.max(20, (int) (displayWidth * 0.1D));
		if (displayWidth - 2 * h_margin > 300)
			h_margin = (displayWidth - 300) / 2;
		return h_margin;
	}

	/** 
	 * Thiết lập hiển thị tool tip
	 * @param _ttText
	 * @param x
	 * @param y
	 * @param duration
	 */
	public void ShowTooltip(String _ttText, int x, int y, int duration) {
		HideTooltip();
		this.tooltipText = _ttText;
		this.tooltipX = x;
		this.tooltipY = y;
		this.tooltipDuration = duration;
		invalidate();
	}

	/**
	 * Ẩn tool tip
	 */
	public void HideTooltip() {
		this.tooltipText = "";
		this.tooltipX = 0;
		this.tooltipY = 0;
		this.tooltipDuration = 0;

		invalidate();
	}

	/* (non-Javadoc)
	 * Khi chọn close chương trình
	 * @see net.rim.device.api.ui.Screen#onClose()
	 */
	public boolean onClose() {
		Planex1App app = (Planex1App) UiApplication.getUiApplication();
		//đếm số màn hình hiển có
		int scrnCount = app.getScreenCount();
		if (scrnCount == 1) {
			if (ParamsStorage.server != null) {
				// TODO -- don't have function Disconect.
				// ParamsStorage.server.Disconnect();
			}

		}

		return super.onClose();
	}

	/* (non-Javadoc)
	 * vẽ màn hình
	 * @see net.rim.device.api.ui.Screen#paint(net.rim.device.api.ui.Graphics)
	 */
	protected void paint(Graphics graphics) {
		super.paint(graphics);
		
		//nếu tip có 
		if ((this.tooltipText != "") && (this.tooltipDuration > 0)
				&& (this.tooltipDuration <= 2000)) {
			//Thiết lập font
			graphics.setFont(Font.getDefault().derive(0, 16));
			//tính toán độ rộng tip Text chiếm
			int textWidth = graphics.getFont().getAdvance(this.tooltipText) + 4;
			//tính toán chiều cao
			int textHeight = graphics.getFont().getHeight() + 4;

			//tính toán lại vị trí tooltipX
			if (this.tooltipX + textWidth > Display.getWidth()) {
				this.tooltipX = (Display.getWidth() - textWidth - 4);
			}
			//đặt màu
			graphics.setColor(0);
			//vẽ hình vuông góc tròn
			graphics.drawRoundRect(this.tooltipX - 3, this.tooltipY - 3,
					textWidth + 6, textHeight + 6, 4, 4);
			graphics.setColor(16777215);
			graphics.drawRoundRect(this.tooltipX - 2, this.tooltipY - 2,
					textWidth + 4, textHeight + 4, 4, 4);
			graphics.setColor(0);
			//tô hình vuông góc tròn
			graphics.fillRoundRect(this.tooltipX - 1, this.tooltipY - 1,
					textWidth + 2, textHeight + 2, 4, 4);

			graphics.setColor(16777215);

			//vẽ text
			graphics.drawText(this.tooltipText, this.tooltipX + 2,
					this.tooltipY + 2);
		}
	}

	private final class ScreenSwitchMenuItem extends MenuItem {
		int id = 0;

		/**
		 * menu chuyển screen
		 * @param _id
		 */
		public ScreenSwitchMenuItem(int _id) {

			// TODO : Have problem contructor of MenuItem.
			super("100100", _id, 1);
			setText(TitleScreen.this._res.getString(_id));
			this.id = _id;
		}

		/* (non-Javadoc)
		 * Chạy hiển thị screen 
		 * @see net.rim.device.api.ui.MenuItem#run()
		 */
		public void run() {

			// TODO : Check this function.
			final TitleScreen.ScreenSwitchMenuItem titleSceeen;
			UiApplication.getUiApplication().invokeLater(new Runnable() {

				public void run() {
					IObjectMessageListener ui = (IObjectMessageListener) UiApplication
							.getUiApplication();
					ui.OnMsg(12, id, null);
				}
			});
		}
	}
}
